1 module mruby.compile; 2 3 import core.stdc.stdio; 4 5 import mruby.value; 6 import mruby.mrb_class; 7 import mruby; 8 import mruby.proc; 9 10 extern (C): 11 12 enum mrb_lex_state_enum 13 { 14 EXPR_BEG = 0, 15 EXPR_END = 1, 16 EXPR_ENDARG = 2, 17 EXPR_ENDFN = 3, 18 EXPR_ARG = 4, 19 EXPR_CMDARG = 5, 20 EXPR_MID = 6, 21 EXPR_FNAME = 7, 22 EXPR_DOT = 8, 23 EXPR_CLASS = 9, 24 EXPR_VALUE = 10, 25 EXPR_MAX_STATE = 11 26 } 27 28 enum mrb_string_type 29 { 30 str_not_parsing = 0, 31 str_squote = 1, 32 str_dquote = 3, 33 str_regexp = 7, 34 str_sword = 41, 35 str_dword = 43, 36 str_ssym = 17, 37 str_ssymbols = 49, 38 str_dsymbols = 51, 39 str_heredoc = 65, 40 str_xquote = 131 41 } 42 43 struct mrbc_context 44 { 45 mrb_sym* syms; 46 int slen; 47 char* filename; 48 short lineno; 49 int function (mrb_parser_state*) partial_hook; 50 void* partial_data; 51 RClass* target_class; 52 mrb_bool capture_errors; 53 mrb_bool dump_result; 54 mrb_bool no_exec; 55 mrb_bool keep_lv; 56 mrb_bool no_optimize; 57 } 58 59 struct mrb_ast_node 60 { 61 mrb_ast_node* car; 62 mrb_ast_node* cdr; 63 ushort lineno; 64 ushort filename_index; 65 } 66 67 struct mrb_parser_message 68 { 69 int lineno; 70 int column; 71 char* message; 72 } 73 74 struct mrb_parser_heredoc_info 75 { 76 mrb_bool allow_indent; 77 mrb_bool line_head; 78 enum mrb_string_type 79 { 80 str_not_parsing = 0, 81 str_squote = 1, 82 str_dquote = 3, 83 str_regexp = 7, 84 str_sword = 41, 85 str_dword = 43, 86 str_ssym = 17, 87 str_ssymbols = 49, 88 str_dsymbols = 51, 89 str_heredoc = 65, 90 str_xquote = 131 91 } 92 mrb_string_type type; 93 const(char)* term; 94 int term_len; 95 mrb_ast_node* doc; 96 } 97 98 struct mrb_parser_state 99 { 100 mrb_state* mrb; 101 mrb_pool* pool; 102 mrb_ast_node* cells; 103 const(char)* s; 104 const(char)* send; 105 FILE* f; 106 mrbc_context* cxt; 107 const(char)* filename; 108 int lineno; 109 int column; 110 enum mrb_lex_state_enum 111 { 112 EXPR_BEG = 0, 113 EXPR_END = 1, 114 EXPR_ENDARG = 2, 115 EXPR_ENDFN = 3, 116 EXPR_ARG = 4, 117 EXPR_CMDARG = 5, 118 EXPR_MID = 6, 119 EXPR_FNAME = 7, 120 EXPR_DOT = 8, 121 EXPR_CLASS = 9, 122 EXPR_VALUE = 10, 123 EXPR_MAX_STATE = 11 124 } 125 mrb_lex_state_enum lstate; 126 mrb_ast_node* lex_strterm; 127 uint cond_stack; 128 uint cmdarg_stack; 129 int paren_nest; 130 int lpar_beg; 131 int in_def; 132 int in_single; 133 mrb_bool cmd_start; 134 mrb_ast_node* locals; 135 mrb_ast_node* pb; 136 char[1024] buf; 137 int bidx; 138 mrb_ast_node* all_heredocs; 139 mrb_ast_node* heredocs_from_nextline; 140 mrb_ast_node* parsing_heredoc; 141 mrb_ast_node* lex_strterm_before_heredoc; 142 mrb_bool heredoc_end_now; 143 void* ylval; 144 size_t nerr; 145 size_t nwarn; 146 mrb_ast_node* tree; 147 mrb_bool no_optimize; 148 mrb_bool capture_errors; 149 mrb_parser_message[10] error_buffer; 150 mrb_parser_message[10] warn_buffer; 151 mrb_sym* filename_table; 152 size_t filename_table_length; 153 int current_filename_index; 154 mrb_jmpbuf* jmp; 155 } 156 157 struct mrb_jmpbuf; 158 159 160 mrbc_context* mrbc_context_new (mrb_state* mrb); 161 void mrbc_context_free (mrb_state* mrb, mrbc_context* cxt); 162 const(char)* mrbc_filename (mrb_state* mrb, mrbc_context* c, const(char)* s); 163 void mrbc_partial_hook (mrb_state* mrb, mrbc_context* c, int function (mrb_parser_state*) partial_hook, void* data); 164 mrb_value mrb_toplevel_run_keep (mrb_state*, RProc*, uint); 165 mrb_parser_state* mrb_parser_new (mrb_state*); 166 void mrb_parser_free (mrb_parser_state*); 167 void mrb_parser_parse (mrb_parser_state*, mrbc_context*); 168 void mrb_parser_set_filename (mrb_parser_state*, const(char)*); 169 const(char)* mrb_parser_get_filename (mrb_parser_state*, ushort idx); 170 mrb_parser_state* mrb_parse_file (mrb_state*, FILE*, mrbc_context*); 171 mrb_parser_state* mrb_parse_string (mrb_state*, const(char)*, mrbc_context*); 172 mrb_parser_state* mrb_parse_nstring (mrb_state*, const(char)*, int, mrbc_context*); 173 RProc* mrb_generate_code (mrb_state*, mrb_parser_state*); 174 mrb_value mrb_load_file (mrb_state*, FILE*); 175 mrb_value mrb_load_string (mrb_state* mrb, const(char)* s); 176 mrb_value mrb_load_nstring (mrb_state* mrb, const(char)* s, int len); 177 mrb_value mrb_load_file_cxt (mrb_state*, FILE*, mrbc_context* cxt); 178 mrb_value mrb_load_string_cxt (mrb_state* mrb, const(char)* s, mrbc_context* cxt); 179 mrb_value mrb_load_nstring_cxt (mrb_state* mrb, const(char)* s, int len, mrbc_context* cxt);